Hexo MathJax折腾记

前言

作为一位程序猿,最近迷上了Markdown的写作。于是找了一些笔记、博客的软件来测试,包括(为知笔记、有道笔记、简书…等等等)。

由于辅导孩子学习的缘故,想把平时讲解的数学题也记录下来。数学题中有一些公式,用Word转图片?可以基本解决,但是修改不方便,而且根本没法搜索。

归纳一下我的需求:

  • Markdown编辑
  • 方便保存本地文档和发布共享
  • 支持数学公式

于是上网搜索,找到了HexoLaTeX以及MathJax,可以满足我的需求。

Hexo

LaTeX

MathJax

Hexo

安装过程不再累述,参考官网文档

主题

主题根据个人喜好,选择了Maupassant,具体配置可参考Maupassant中文文档

Maupassant

Hexo问题解决

Error: Cannot find module ‘./build/Release/DTraceProviderBindings’

安装完Hexo后在命令行出现了错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
$ hexo
{ Error: Cannot find module './build/Release/DTraceProviderBindings'
at Function.Module._resolveFilename (module.js:469:15)
at Function.Module._load (module.js:417:25)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/usr/local/lib/node_modules/hexo-cli/node_modules/dtrace-provider/dtrace-provider.js:17:23)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/usr/local/lib/node_modules/hexo-cli/node_modules/bunyan/lib/bunyan.js:79:18)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32) code: 'MODULE_NOT_FOUND' }
{ Error: Cannot find module './build/default/DTraceProviderBindings'
at Function.Module._resolveFilename (module.js:469:15)
at Function.Module._load (module.js:417:25)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/usr/local/lib/node_modules/hexo-cli/node_modules/dtrace-provider/dtrace-provider.js:17:23)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/usr/local/lib/node_modules/hexo-cli/node_modules/bunyan/lib/bunyan.js:79:18)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32) code: 'MODULE_NOT_FOUND' }
{ Error: Cannot find module './build/Debug/DTraceProviderBindings'
at Function.Module._resolveFilename (module.js:469:15)
at Function.Module._load (module.js:417:25)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/usr/local/lib/node_modules/hexo-cli/node_modules/dtrace-provider/dtrace-provider.js:17:23)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/usr/local/lib/node_modules/hexo-cli/node_modules/bunyan/lib/bunyan.js:79:18)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32) code: 'MODULE_NOT_FOUND' }
INFO [hexo-math] Using engine 'mathjax'
INFO [hexo-inject] installing hotfix for hexojs/hexo#1791
Usage: hexo <command>
...

上网查找了解决方法,在我的电脑上总是不成功。根据出错信息at Object.<anonymous> (/usr/local/lib/node_modules/hexo-cli/node_modules/bunyan/lib/bunyan.js:79:18)直接修改了bunyan.js这个文件,问题搞定。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var os, fs, dtrace;
if (runtimeEnv === 'browser') {
os = {
hostname: function () {
return window.location.host;
}
};
fs = {};
dtrace = null;
} else {
os = require('os');
fs = require('fs');
try {
//dtrace = require('dtrace-provider' + '');
} catch (e) {
dtrace = null;
}
}

如上图,注释掉14行(文件中的79行)。稍微看了一下这个文件的处理逻辑,注释掉并不会对使用Hexo有任何影响。

与MathJax兼容

Hexo与MathJax在大部分的时候表现完美,但是Markdwon本身的特殊符号与Latex中的符号会出现冲突的时候:

_转义。在markdown中,_是斜体,但是在latex中,却有下标的意思,就会出现问题。
\\换行转义。在markdown中,\\会被转义为\会影响影响MathJax对公式中的\\进行渲染,导致独立公式块不能够换行;

有几种方法可以解决这个问题,比如:修改Hexo生成Markdown的引擎。我选择的是最粗暴的,修改nodes_modules/marked/lib/marked.js文件,去除对_\\的转义。

首先:找到下面的代码

1
escape: /^\\([\\`*{}\[\]()# +\-.!_>])/,

改为:

1
escape: /^\\([`*{}\[\]()# +\-.!_>])/,

这样就会去掉\\的转义了。

然后,找到em的符号

1
em: /^\b_((?:[^_]|__)+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,

改为:

1
em:/^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,

去掉_的斜体含义。

完美的Markdown编辑工具Typora

最后推荐一个很好的Markdown编辑工具Typora,这个文档就是用它编辑的,最大的特点就是可以所见即所得。

来自让 Markdown 写作更简单,免费极简编辑器:Typora